הפונקציה in_array של PHP משמשת אותנו בהרבה מקרים, אבל יש לה גם תכונות מיוחדות שעשויות לגרום לתוצאות להיות לא צפיות.
הקוד הבא ממחיש את זה:
$array = array(0, 'one', 'two');
var_dump(in_array('three', $array));
var_dump(in_array('three', $array));
למרבה ההפתעה, התוצאה שתתקבל היא true.
הסיבה לזה היא ש-PHP ממירה את סוגי הנתונים השונים לסוג אחד בשביל השוואה, במקרה שלנו ל-integer.
כשהמחרוזת three מומרת ל-integer, מתקבל המספר 0 (שכן מופיע במערך), ולכן התוצאה המתקבלת לפונקציה היא true.
הפתרון
הפרמטר השלישי של in_array קובע אם לא להמיר סוג הנתונים לשם ההשוואה. הקוד הבא יחזיר את התוצאה הצפויה כמו שצריך:
$array = array(0, 'one', 'two');
var_dump(in_array('three', $array, true));
var_dump(in_array('three', $array, true));
הגיע הזמן להתרגל להשתמש גם ב-true, הפרמטר השלישי ב-in_array.
דוגמא נוספת תוכלו למצוא כאן.
תגובות לכתבה:
כל הכבוד, אהבתי !
נחמד, תודה. אני ידעתי על זה מהמאמר באנגלית אבל נחמד שאתה מפרסם את זה פה.
תודה, לא ידעתי על כך לפני כן. :)
נשאלה השאלה:
אלכס, למה זה ככה? כלומר, למה עדיף לנו שהפונקציה תעשה המרה?
הנה התשובה:
זה בכלל לא עדיף. הפוך, עדיף לנו שהפונקציה _לא_ תעשה המרות.
PHP היא שפה דינאמית, כלומר למשתנים אין סוגים קבועים ולכן ב PHP יש שני סוגי השוואות. השוואה בלי בדיקת טיפוס נתונים == והשוואה קפדנית === שבודקת גם סוג.
לפי ברירת מחדל PHP משתמשת בהשוואה פשוטה == בכל המקרים ו in_array הוא אחד המקרים האלה.
לדעתי האישית, זה רע מאוד ואני תמיד כותב === בכל מקום, גם אם זה דורש ממני לדעת מה הסוג נתונים הנכנס או לעשות המרות.
הפרמטר השלישי ב in_array אומר לPHP איזה סוג השוואה לעשות. השוואה טיפשית == או השוואה קפדנית === והוספת true בתור פרמטר שלישי הופך את השוואות לקפדניות, כדי שהמתכנת לא יצטרך לשבור כמה שעות את הראש על חיפוש באגים שמופיעים רק בהשוואת לא קפדניות.
--
באופן כללי בתכנות, מכאן ולהבא, כמה שיותר קפדני הקוד שלך, ככה קטן יותר הסיכוי לעשות טעויות או לבזבז כמה שעות או ימים על בעיות שקשה לאתר.
לדעתי הכי פשוט לעשות
isset($array["three"]);
טעיתי זה מערך לא אובייקט. וה in_array הולך על הערכים.
חשבתי שזה מחפש את הkey.